home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2006 February
/
Gamestar_81_2006-02_dvd.iso
/
Red Shark
/
Common
/
BaseMission.script
< prev
next >
Wrap
Text File
|
2002-01-30
|
18KB
|
721 lines
//-------------------------------------------------------------------
//
// This code is copyright 2001 by G5 Software.
// Any unauthorized usage, either in part or in whole of this code
// is strictly prohibited. Violators WILL be prosecuted to the
// maximum extent allowed by law.
//
//-------------------------------------------------------------------
class CBaseMission extends CStrings, CMissionMessageColors
{
//
// settings
//
//#TODO: set to true to see nav-point
final boolean m_EditorMode = false;// editor mode
//
// should be called by subclassing classes from their Init() method
//
int m_nObjects2Load;
int m_nObjectsLoaded;
void BaseMission_UpdateLoadProgress()
{
m_nObjectsLoaded = m_nObjectsLoaded + 1;
int percent = m_nObjectsLoaded * 1000 / m_nObjects2Load;
Core_CallFunction(
SOID_GameMenu,
"SendCommandToControl",
"ID_LOAD_PROGRESS_BAR",
"SET_PROGRESS",
percent
);
}
void BaseMission_InitMission()
{
m_bMissionStatusActive = false;
m_bMissionMenuActive = false;
m_bMissionQuit = false;
array ids = GetObjectsIDs();
m_nObjects2Load = 6 + ids.size() + GetAutoGeneratedUnitsQty();
m_nObjectsLoaded = 0;
//
// Create components common to all missions
//
// CreateComponent(IDToRegister, ComponentID, ScriptName | FileName | "")
BaseMission_UpdateLoadProgress();
CreateComponent("Effects", "EffectsArray", "CEffectsArray");
BaseMission_UpdateLoadProgress();
CreateComponent("Sounds", "SoundsArray", "CSoundsArray");
BaseMission_UpdateLoadProgress();
CreateComponent("Bullets", "BulletsArray", "CBulletsArray");
BaseMission_UpdateLoadProgress();
CreateComponent("Explosions", "ExplosionsArray", "CExplosionsArray");
BaseMission_UpdateLoadProgress();
CreateComponent("RouterPrecalculatedGraph", "RouterPrecalculatedGraph", "CRouterPrecalculatedGraph");
BaseMission_UpdateLoadProgress();
CreateComponent("LensFlare", "LensFlare", "");
}
void BaseMission_CreateObjects()
{
//
// Create individual mission components
//
array ids = GetObjectsIDs();
array clss = GetObjectsScriptClassNames();
array cids = GetObjectsScriptComponentIDs();
array matrs = GetObjectsMatrices();
array behscrs = GetObjectsBehaviorScripts();
array cstprms = GetObjectsCustomParameters();
for (int i = 0; i < ids.size(); i = i + 1)
{
BaseMission_UpdateLoadProgress();
// do not create nav points in non editor mode
if ( clss[i] != "CNavPoint" || m_EditorMode)
{
CreateComponent( ids[i], cids[i], clss[i]);
SetComponentPosition( ids[i], matrs[i]);
if ( behscrs.type() == ST_ARRAY) // prevent failure of old style missions
{
if ( behscrs[i] != "")
{
SetBehaviorTask( ids[i], behscrs[i]);
}
}
}
if ( clss[i] == "CNavPoint")
{
string str_radius;
if ( cstprms.type() == ST_ARRAY)
str_radius = cstprms[i];
else
str_radius = "";
// tell AIController about NavPoint
Core_SendEventTo(
"AIController",
"OnAddNavPoint",
ids[i], // name of nav-point
matrs[i], // position of nav-point
Core_String2Float( str_radius)); // custom params - radiuses
Core_SendEventTo(
ids[i],
"OnSetCustomParameter",
str_radius);
}
}
}
//
//
// *** routine functions
//
//
void CreateUnitLine(
string _NamePrefix,
string _ObjectScript,
string _AIScript,
int _ObjectNum,
vector _LineStart,
vector _LineEnd)
{
for ( int u = 0; u < _ObjectNum; u = u + 1)
{
float x = Core_GetVectorX(_LineStart) + (Core_GetVectorX(_LineEnd) - Core_GetVectorX(_LineStart)) * u / _ObjectNum;
float y = Core_GetVectorY(_LineStart) + (Core_GetVectorY(_LineEnd) - Core_GetVectorY(_LineStart)) * u / _ObjectNum;
BaseMission_UpdateLoadProgress();
CreateComponent( _NamePrefix + u, "GameObject", _ObjectScript);
SetComponentPosition(
_NamePrefix + u,
matrix(
1.0, 0.0, 0.0, x,
0.0, 1.0, 0.0, y,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0));
SetBehaviorTask( _NamePrefix + u, _AIScript);
}
}
void CreateUnitLineGroup(
string _NamePrefix,
array _GroupObjectScript,
array _GroupAIScript,
array _GroupObjectNum,
int _ObjectNum,
vector _LineStart,
vector _LineEnd)
{
int GroupIndex = 0;
int InGroupIndex = 0;
for ( int u = 0; u < _ObjectNum; u = u + 1)
{
float x = Core_GetVectorX(_LineStart) + (Core_GetVectorX(_LineEnd) - Core_GetVectorX(_LineStart)) * u / _ObjectNum;
float y = Core_GetVectorY(_LineStart) + (Core_GetVectorY(_LineEnd) - Core_GetVectorY(_LineStart)) * u / _ObjectNum;
BaseMission_UpdateLoadProgress();
CreateComponent( _NamePrefix + u, "GameObject", _GroupObjectScript[GroupIndex]);
SetComponentPosition(
_NamePrefix + u,
matrix(
1.0, 0.0, 0.0, x,
0.0, 1.0, 0.0, y,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0));
SetBehaviorTask( _NamePrefix + u, _GroupAIScript[GroupIndex]);
InGroupIndex = InGroupIndex + 1;
if ( InGroupIndex >= int(_GroupObjectNum[GroupIndex]))
{
GroupIndex = GroupIndex + 1;
InGroupIndex = 0;
};
}
}
void CreateUnitField(
string _NamePrefix,
string _ObjectScript,
string _AIScript,
int _ObjectNum,
vector _Center,
float _Radius)
{
for ( int u = 0; u < _ObjectNum; u = u + 1)
{
float x = Core_GetVectorX(_Center) + rand( -_Radius, _Radius);
float y = Core_GetVectorY(_Center) + rand( -_Radius, _Radius);
BaseMission_UpdateLoadProgress();
CreateComponent( _NamePrefix + u, "GameObject", _ObjectScript);
SetComponentPosition(
_NamePrefix + u,
matrix(
1.0, 0.0, 0.0, x,
0.0, 1.0, 0.0, y,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0));
SetBehaviorTask( _NamePrefix + u, _AIScript);
}
}
//
// Game Object destroyed handler
//
void BaseMission_OnGameObjectDestroyed(string _id)
{
// "Helicopter" currently is a reserved id for a player's heli
if (_id == "Helicopter")
{
BaseMission_FastQuit();
}
}
//
// Delayed quit from mission method
//
boolean m_bMissionQuit;
void BaseMission_DelayedQuit()
{
if (m_bMissionQuit)
return;
// call mission "QuitMission" handler
OnQuitMission();
// quit this mission in 10 seconds
Core_ScheduleTask(
SOID_GameController,
OT_CallFunction,
10.0,
"OnQuitMission"
);
m_bMissionQuit = true;
}
void BaseMission_FastQuit()
{
if (m_bMissionQuit)
return;
// call mission "QuitMission" handler
OnQuitMission();
// quit this mission in 10 seconds
Core_ScheduleTask(
SOID_GameController,
OT_CallFunction,
1.5,
"OnQuitMission"
);
m_bMissionQuit = true;
}
//
// Mission status screen
//
// OnShowMissionStatus() is called from GameController
//
bool m_bMissionStatusActive = false;
void OnShowMissionStatus()
{
// no mission status screen if menu is active
if (m_bMissionMenuActive)
return;
if (m_bMissionHelpActive)
return;
if (m_bMissionStatusActive)
{
OnHideMissionStatus();
return;
}
StoreControlsState();
EnableControl("", false);
EnableControl(SOID_MissionMenu, true);
Core_SendEventTo(
SOID_MissionMenu,
"BaseMenu_SetMissionStatus",
GetMissionObjectives(),
GetMissionObjectivesStatuses(),
GetBonusMissionObjectives(),
GetBonusMissionObjectivesStatuses(),
GetMissionStatistics(),
true, // in-game flag, notifies that mission is not yet over
// and menu should display 'In progress' but not 'Failed'
// for incomplete objectives
false // mission complete flag
);
Core_CallFunction(
SOID_MissionMenu,
"GoToSubMenu",
"BaseMenu_ShowMissionStatus");
PauseGame(true);
m_bMissionStatusActive = true;
}
void OnHideMissionStatus()
{
if (!m_bMissionStatusActive)
return;
RestoreControlsState();
PauseGame(false);
// go to the root of the mission menu
// so that user would see the root mission menu
// when he invokes mission menu next time
Core_CallFunction(SOID_MissionMenu, "GoToRootMenu");
m_bMissionStatusActive = false;
}
void OnQuitMission()
{
Core_SendEventTo(
SOID_GameController,
"OnSetMissionResult",
GetMissionObjectives(),
GetMissionObjectivesStatuses(),
GetBonusMissionObjectives(),
GetBonusMissionObjectivesStatuses(),
GetMissionStatistics()
);
}
//
// Mission menu
//
// OnShowMissionMenu() is called from GameController
//
bool m_bMissionMenuActive = false;
void OnShowMissionMenu()
{
// no mission menu if mission status screen is active
if (m_bMissionStatusActive)
return;
if (m_bMissionHelpActive)
return;
if (m_bMissionMenuActive)
{
OnHideMissionMenu();
return;
}
StoreControlsState();
EnableControl("", false);
EnableControl(SOID_MissionMenu, true);
PauseGame(true);
m_bMissionMenuActive = true;
}
void OnForceMissionMenu()
{
if (m_bMissionMenuActive)
return;
OnShowMissionMenu();
}
void OnHideMissionMenu()
{
if (!m_bMissionMenuActive)
return;
RestoreControlsState();
PauseGame(false);
// the cursor might be hidden and locked by key control
// in the settings screen -- unlock and show to return to normal state
Core_CallFunction(SOID_MissionMenu, "ShowAndUnlockCursor");
// go to the root of the mission menu
// so that user would see the root mission menu
// when he invokes mission menu next time
Core_CallFunction(SOID_MissionMenu, "GoToRootMenu");
m_bMissionMenuActive = false;
}
//
// Mission help screen
//
// OnShowMissionHelpScreen() is called from GameController
//
bool m_bMissionHelpActive = false;
void OnShowMissionHelpScreen()
{
// no mission status screen if menu is active
if (m_bMissionMenuActive)
return;
if (m_bMissionStatusActive)
return;
if (m_bMissionHelpActive)
{
OnHideMissionHelpScreen();
return;
}
StoreControlsState();
EnableControl("", false);
EnableControl(SOID_MissionMenu, true);
Core_CallFunction(
SOID_MissionMenu,
"GoToSubMenu",
"BaseMenu_ShowMissionHelpScreen");
PauseGame(true);
m_bMissionHelpActive = true;
}
void OnHideMissionHelpScreen()
{
if (!m_bMissionHelpActive)
return;
RestoreControlsState();
PauseGame(false);
// go to the root of the mission menu
// so that user would see the root mission menu
// when he invokes mission menu next time
Core_CallFunction(SOID_MissionMenu, "GoToRootMenu");
m_bMissionHelpActive = false;
}
//
// Service methods
//
void PauseGame(bool _pause)
{
Core_CallFunction(SOID_GameController, "PauseGame", _pause);
}
void StoreControlsState()
{
Core_CallFunction(SOID_GameController, "StoreControlsState");
}
void RestoreControlsState()
{
Core_CallFunction(SOID_GameController, "RestoreControlsState");
}
void EnableControl(string _control, bool _enable)
{
Core_CallFunction(SOID_GameController, "EnableControl", _control, _enable);
}
//
// Objectives
array GetMissionObjectives()
{
return m_MissionObjectives;
}
array GetMissionObjectivesStatuses()
{
return m_MissionObjectivesStatuses;
}
void SetMissionObjectiveStatus(int _obj, string _status)
{
m_MissionObjectivesStatuses[_obj] = _status;
}
//
// Bonus objectives
array GetBonusMissionObjectives()
{
return m_BonusMissionObjectives;
}
array GetBonusMissionObjectivesStatuses()
{
return m_BonusMissionObjectivesStatuses;
}
void SetBonusMissionObjectiveStatus(int _obj, string _status)
{
m_BonusMissionObjectivesStatuses[_obj] = _status;
}
//
// Mission statistics
string GetMissionStatistics()
{
return "CBaseMission methods to override: 3";
}
//
// Mission navpoints
array GetNavPoints()
{
array navpoints =
array(
vector(0, 0, 0),
vector(16000, 16000, 0)
);
return navpoints;
}
array GetNavPointsDescriptions()
{
return m_NavigationPoints;
}
//
// Methods common to all missions
//
void BaseMission_CompleteObjective(int _obj)
{
array objectives = GetMissionObjectives();
array statuses = GetMissionObjectivesStatuses();
if (statuses[_obj] == str_ObjectiveComplete)
return;
SetMissionObjectiveStatus(_obj, str_ObjectiveComplete);
Core_BroadcastEvent(
"OnDisplayMessage",
str_CompleteMessage + objectives[_obj],
m_ObjectiveCompleteMessageColor
);
// check whether all base objectives are complete
// refresh statuses
statuses = GetMissionObjectivesStatuses();
// mission is complete if all the main objectives are complete
bool bMissionComplete = true;
for (int i = 0; i < statuses.size(); i = i + 1)
{
bMissionComplete = bMissionComplete && (statuses[i] == str_ObjectiveComplete);
}
// check whether all bonus objectives are complete
// refresh statuses
statuses = GetBonusMissionObjectivesStatuses();
// mission is complete if all the main objectives are complete
bool bBonusMissionComplete = true;
for (int i = 0; i < statuses.size(); i = i + 1)
{
bBonusMissionComplete = bBonusMissionComplete && (statuses[i] == str_ObjectiveComplete);
}
if (bMissionComplete)
{
// enable finish mission button in mission status screen
Core_SendEventTo(
SOID_MissionMenu,
"BaseMenu_EnableFinishMission");
}
if (bMissionComplete && bBonusMissionComplete)
BaseMission_DelayedQuit();
if (bMissionComplete && !bBonusMissionComplete)
{
// show mission status in 5 seconds
Core_ScheduleTask(
SOID_MissionController,
OT_CallFunction,
5.0,
"OnShowMissionStatus"
);
}
}
void BaseMission_FailObjective(int _obj)
{
array objectives = GetMissionObjectives();
array statuses = GetMissionObjectivesStatuses();
SetMissionObjectiveStatus(_obj, str_ObjectiveFailed);
Core_BroadcastEvent(
"OnDisplayMessage",
str_FailedMessage + objectives[_obj],
m_ObjectiveFailedMessageColor
);
// one of the base objectives failed - quit
BaseMission_DelayedQuit();
}
void BaseMission_CompleteBonusObjective(int _obj)
{
array objectives = GetBonusMissionObjectives();
array statuses = GetBonusMissionObjectivesStatuses();
if (statuses[_obj] == str_ObjectiveComplete)
return;
SetBonusMissionObjectiveStatus(_obj, str_ObjectiveComplete);
Core_BroadcastEvent(
"OnDisplayMessage",
str_CompleteMessage + objectives[_obj],
m_ObjectiveCompleteMessageColor
);
// check whether all base and all bonus objectives are complete
// quit if true
// refresh statuses
statuses = GetMissionObjectivesStatuses();
array bonus_statuses = GetBonusMissionObjectivesStatuses();
// mission is complete if all the main objectives are complete...
bool bMissionComplete = true;
for (int i = 0; i < statuses.size(); i = i + 1)
{
bMissionComplete = bMissionComplete && (statuses[i] == str_ObjectiveComplete);
}
// ... and all bonus objectives are complete
for (int i = 0; i < bonus_statuses.size(); i = i + 1)
{
bMissionComplete = bMissionComplete && (bonus_statuses[i] == str_ObjectiveComplete);
}
if (bMissionComplete)
BaseMission_DelayedQuit();
}
void BaseMission_FailBonusObjective(int _obj)
{
array objectives = GetBonusMissionObjectives();
array statuses = GetBonusMissionObjectivesStatuses();
SetBonusMissionObjectiveStatus(_obj, str_ObjectiveInProgress);
Core_BroadcastEvent(
"OnDisplayMessage",
str_FailedMessage + objectives[_obj],
m_ObjectiveFailedMessageColor
);
}
void DestroyGameObject(string _ObjectId)
{
if (_ObjectId != "Helicopter")
DestroyComponent(_ObjectId);
OnGameObjectDestroyed(_ObjectId);
}
}
class CMissionMessageColors
{
color m_ObjectiveCompleteMessageColor = color(0.0, 0.75, 0.0);
color m_ObjectiveFailedMessageColor = color(1.0, 0.0, 0.0);
color m_GoodNewsColor = color(0.0, 0.75, 0.0);
color m_BadNewsColor = color(1.0, 0.0, 0.0);
color m_ReminderColor = color(1.0, 1.0, 0.0);
}